/**
 * MQ2传感器驱动 - 头文件
 * 支持模拟输出(AO)和数字输出(DO)
 */
#ifndef MQ2_SENSOR_H
#define MQ2_SENSOR_H

#include <stdint.h>
#include <stdbool.h>

// 气体类型定义
typedef enum {
    GAS_NORMAL = 0,     // 正常空气
    GAS_SMOKE,          // 烟雾
    GAS_LPG,            // 液化石油气
    GAS_METHANE,        // 甲烷
    GAS_HYDROGEN,       // 氢气
    GAS_UNKNOWN         // 未知气体
} mq2_gas_type_t;

// 气体浓度等级
typedef enum {
    LEVEL_NORMAL = 0,   // 正常
    LEVEL_WARNING,      // 警告
    LEVEL_DANGER,       // 危险
    LEVEL_CRITICAL      // 严重危险
} mq2_level_t;

// MQ2传感器配置结构体
typedef struct {
    // 模拟输出配置
    int adc_channel;    // ADC通道 (例如 ADC1_CHANNEL_6 对应GPIO34)
    uint32_t adc_vref;  // ADC参考电压 (mV)

    // 数字输出配置
    int do_pin;         // DO引脚GPIO编号 (如不需要可设为-1)

    // 阈值配置 (mV)
    uint32_t threshold_normal;   // 正常范围上限
    uint32_t threshold_warning;  // 警告范围上限
    uint32_t threshold_danger;   // 危险范围上限

    // 气体类型阈值倍数 (相对于危险阈值)
    float gas_multipliers[5];    // 对应5种气体类型

    // 内部使用
    uint32_t baseline;           // 环境基线值
    bool is_initialized;         // 初始化标志
} mq2_config_t;

// MQ2传感器数据结构体
typedef struct {
    uint32_t voltage;            // 当前电压值 (mV)
    float concentration;         // 浓度百分比 (0-100%)
    mq2_level_t level;           // 浓度等级
    mq2_gas_type_t gas_type;     // 可能的气体类型
    bool do_state;               // DO引脚状态 (仅当配置了DO引脚时有效)
} mq2_data_t;

// 默认配置
extern const mq2_config_t MQ2_DEFAULT_CONFIG;

/**
 * 初始化MQ2传感器
 * @param config 传感器配置
 * @return 初始化成功返回true，失败返回false
 */
bool mq2_init(mq2_config_t *config);

/**
 * 预热传感器
 * @param config 传感器配置
 * @param seconds 预热时间(秒)
 */
void mq2_preheat(mq2_config_t *config, uint32_t seconds);

/**
 * 测量环境基线值
 * @param config 传感器配置
 * @param samples 采样次数
 * @return 环境基线值(mV)
 */
uint32_t mq2_measure_baseline(mq2_config_t *config, uint32_t samples);

/**
 * 读取传感器数据
 * @param config 传感器配置
 * @param data 存储读取结果的结构体
 * @return 读取成功返回true，失败返回false
 */
bool mq2_read_data(mq2_config_t *config, mq2_data_t *data);

/**
 * 获取气体类型字符串
 * @param gas_type 气体类型
 * @return 气体类型的字符串表示
 */
const char* mq2_get_gas_type_string(mq2_gas_type_t gas_type);

/**
 * 获取浓度等级字符串
 * @param level 浓度等级
 * @return 浓度等级的字符串表示
 */
const char* mq2_get_level_string(mq2_level_t level);

#endif // MQ2_SENSOR_H
